/**
 * 给定存在重复数据的数组nums,返回所有子集（包括空集）
 * @param {number[]} nums 
 */
// 回溯法
var subsets = function (nums) {
    const result = []
    // 排序nums数组
    nums.sort((a, b) => {
        a - b
    })

    function backTrack(start, curr) {
        // 把curr加入result数组
        result.push([...curr])
        for (let i = start; i < nums.length; i++) {
            if (i > start && nums[i] === nums[i - 1]) {
                // 当前元素和上一个元素相等就跳过本次循环，避免重复
                continue
            }
            curr.push(nums[i])
            backTrack(i + 1, curr)
            // 把curr最后一个元素移除,体现回溯
            curr.pop()
        }
    }

    backTrack(0, [])
    return result
}
/**
原数组[1,2,3]
             []
     [1]         [2]    [3]
[1,2]   [1,3]   [2,3]
[1,2,3]
*/

